package com.tedu.API;

import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 *  JavaSE：基础语法，JavaOOP面向对象编程，JavaAPI(帮助文档，理解：字典)
 *
 *  JavaAPI【内置：Java编制好的】提供大量类，接口，抽象类，异常，错误
 *  【预计提供好的类库：8000个，JavaAPI只学重点】
 *
 *  JavaAPI：字符串、包装类、集合【泛型】、线程、多线程【并发---大数据】、IO流、Socket套接字【网络编程】
 *
 *  jk1.8.chm帮助文档 ：理解 字典    会查类、抽象、接口...使用
 *  JDK版本---帮助文档     根据用什么版本的JDK，查对应版本的帮助文档
 *  必须会查API    String【类】---位于什么包下？  java.lang包下【默认包：不需要导包】
 *
 *     java: 错误: 无效的源发行版：17
 *     maven项目：自动下载：junit版本--testng级别【识别JDK17】
 *     调整maven项目jdk版本：17版本降级1.8版本
 *     找到pom.xml----17
 *
 */
public class StringAPI {
    /**
     * JDK1.8  StringAPI类库：构造器怎么用，方法怎么用
     * 包位置：java.lang 【不需要导包：System、String】
     * 特点：不需要导包，不可以继承，字符数组、定义完毕无法修改 但可以覆盖
     *   String类是final修饰的
     *   java字符串编码集：UniCode【顶级】：GBK、UTF-8，任何一个字符对应两个字节
     * 字符串数组：封装了字符数组及针对字符数组的操作算法
     * 字符数组===字符串
     * 定义：String str="直接量";   给定制创建String字符串对象
     *      String str=new String(); 创建String字符串新对象
     */
    @Test
    public void testString(){
    String str="字符串";
        System.out.println(str);
    char[] c={'字','符','串'};  //字符数组：静态字符数组
        System.out.println(c);
      //字符串创建出来，对象无法修改，因为String是final修饰
        String s="hello";
         s="0";  //对 对象进行覆盖
        System.out.println(s);
    }
    /**
     * 定义给定值方式：String str="java123";
     * Java为了提高性能，针对静态字符串(字面量/常量/链接后结果)
     * 创建在String常量池中，对于重复创建静态字符串，JVM虚拟机首先会在常量池中查找，
     * 如果找到就返回对象，找不到继续创建对象！
     *
     *JVM会在虚拟机的堆内存中开辟一块空间，保存曾经使用过的字面量|常量
     * 一旦后期又使用相同的字面量|常量，不会创建新对象，直接使用老对象
     *
     * 好处：减少内存开销，提高性能
     *
     */
    @Test
    public void testStrings(){
        String s1="java123";//公共常量池
        String s2="java123";///不会创建对象，从常量池java
        System.out.println(s1==s2);//true
        String s="java";   //s对象 不可修改
        String s3=s+"123"; //s3对象=s对象+"123"   s3成为了新对象
        System.out.println(s1==s3);//false
        String s4="java"+"123";    //右侧位：直接量方式拼接，依旧是静态字符串 存入常量池中
        System.out.println(s2==s4);  //true
        //s2的java123是从常量池中获取(s1存入)，s4是拼接后的静态字符串，从常量池获取

    //---------上面代码：给定值定义字符串方式：拥有常量池----------------------
    //---------下面代码：创建字符串对象方式：创建新对象------------------------
        String s5=new String("java123");
       //new出来的对象，一定是新对象，不存在常量池
        System.out.println(s4==s5);  //false
    }
    /**
     * String API  方法
     * length方法   返回值：int
     * 作用：返回当前字符串的的长度(个数)---借鉴于数组中length方法
     * 特点：字符串包含：特殊字符 空格，字母，汉字
     *      String对象采用Uincode顶级编码：每个字符算1个，占2个字节
     */
    @Test
    public void testLength(){
        String str="Hello World";  //11个  空格也占一位  算俩字节
        System.out.println(str.length());
        str=" 我爱java";
        System.out.println(str.length());//7个
    }
    /**
     * indexOf方法----- 拥有重载功能：修饰符 返回值 方法名 一致
     *                                           参数 不一致
     * indexOf(String index)  返回值：int
     * 第一个参数 String index：传入指定字符串
     * 作用：查找指定字符串在当前字符串中的位置,首位置
     *      如果匹配到对应字符，输出首位下标，
     *      如果没有匹配到对应字符，返回-1值
     * indexOf(String str,int index)  返回值：int
     * 第一个参数 String str：传入指定字符串
     * 第二个参数 int index：查找指定具体位置的下标
     * 作用：查找"具体下标位"的“字符串”在"当前字符串"中的位置,首位置，
     *      如果查找相同名称，需要向下一位查找，不包含当前位置
     *      如果没有匹配对应字符，返回-1值
     * lastIndexOf(String str)方法
     * 作用：找到匹配字符串中对应最后出现子字符串位置
     */
    @Test
    public void testIndexOf(){
        String str="thinking in java";//java编程思想【第四版】 thinking in java
        //返回值：下标位
        int index=str.indexOf("in"); //首次出现的位置 从0开始数 t-0 h-1 i-2   用处：查找第一位相同
    //    int index=str.indexOf("jv");   没有匹配上 输出-1
        System.out.println("打印下标位："+index);//输出2
        index=str.indexOf("in",3);   //用处：查找指定某一位相同
        System.out.println("指定下标位："+index); //输出 5
        //lsatIndexOf()找到最后一次出现的下标位置
        index=str.lastIndexOf("in");
        System.out.println("最后的下标位："+index);
    }
    /**
     * StringAPI针对字符串提供三种方法：截取、替换、分割【常用方法】.
     * subString()重载方法   截取  返回值：String
     * subString(int start,int end)
     * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
     * subString(int index)
     * 作用：截取字符串，从下标Index位置开始截取,截取到最后
     * 通用口诀：含头不含尾
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";//需求：通过截取字符串baidu
    //    url=url.substring(9,12); //.co
    //      System.out.println("截取子字符串："+url);
     //需求：通过截取字符串  .com
        url=url.substring(9);
        System.out.println("截取子字符串，截取到最后："+url);
    }
    /**
     * charAt(int index)方法     返回值：char
     * 作用：返回当前字符串中指定位置的字符
     *StringIndexOutOfBoundsException  异常
     * 字符串下标越界异常---出现原因：下标超出范围
     */
    @Test
    public void testCharAt(){
        String str="thinking in java";
        char c=str.charAt(10); //  最大范围16  超出下标范围  报错
        System.out.println("获取对应字符："+c);
    }
    /**
     * trim()方法     返回值：String
     * 作用：去掉当前字符串前后空格【转大小写叠加使用】
     * 统一转换大小写，去掉空格之后(之前)都可以
     *
     * toLowerCase()方法  返回值：String
     * 作用：将字符串中所有字符转化为小写
     * toUpperCase()方法  返回值：String
     * 作用：将字符串中所有字符转换为大写
     * 验证码：xD4e  前台显示：xD4e    用户输入：xd4e
     */
    @Test
    public void testTrim(){
        String str=" xD4e ";//后台出入前后都加空格，xD4e判断
        //后台传入前台字符串---一律去空格
        str=str.trim().toLowerCase();  //去掉前后空格 将字符串中所有字符转化为小写
        System.out.println("去掉空格："+str);
    }
    /**
     * [PHP-前端]正则表达式：语法-元字符  ^ [0~9]*$
     * 验证字符串
     * matches()方法   返回值：boolean
     * 作用：用于验证字符串，使用正则表达式进行验证【过滤字符】
     * 返回 true 正则验证成功   返回false 正则验证失败
     */
    public static void main(String[] args) {
        String regex="^[0-9]*$";
        System.out.println("请输入:");
        //从控制台输入【模拟用户输入】 "123"
        Scanner input=new Scanner(System.in);
        //判断,如果正则通过，返回是数字，反之相反
        if(input.nextLine().matches(regex)){
            System.out.println("是数字");
        }else{
            System.out.println("不是数字~");
        }
    }
    /**
     * replace()方法  替换   返回值：String
     * replace(String a,String b)
     * 第一个参数 String a  传入查找字符
     * 第二个参数 String b  传入替换字符
     * 作用：用于匹配字符串中存在字符，匹配成功，替换成新字符，不支持正则
     *
     * replaceALL(String regex,String a)
     * 作用：用于全部匹配字符串中存在字符，按照正则匹配成功，替换成新字符，支持正则
     */
    @Test
    public void testReplace(){
        String str="我爱Java";  //将java替换为Python
        str=str.replace("Java","Python");
        System.out.println("替换后的字符串："+str);

        String regex="^[\\u4e00-\\u9fa5]{0,}$";//验证汉字
        String say="我去年买了个表";
       say=say.replaceAll(regex,"**********");//支持正则
        System.out.println("通过正则替换后的字符串："+say);
    }
    /**
     * split()方法  分割 返回值：String[]
     * 作用：用于按照"正则"或者"字符串"的方式分割字符串
     *   www.baidu.com  按照.的方式获取
     *   split写.  代表正则表达式的"."  代表：匹配一个字符
     *   split写.  注意：转义成  \\.
     */
    @Test
    public void testSplit(){
        String url="www.baidu.com";//不知道下标情况下，获取baidu
        String[] urls=url.split("\\.");
       System.out.println(urls[1]);//获取baidu
     //ArrayIndexOutOfBoundsException 数组下标异常
     // 打印字符串数组--用增强for   数组的数据类型 引用： 遍历数组引用
     for(String s:urls){
         System.out.println("分割后元素值："+s);
     }
    }
    /**
     * valueOf()方法   静态方法：通过类名访问   返回值：String
     * 作用：将基础数据类型转换为字符串
     */
    @Test
    public void testValueOf(){
        int i=123; //将基础数据类型转化为字符串
        String s=String.valueOf(i);
        if(s.equals("123")){ //  s对象=="123"  判断对象   false
                             //   s对象.equals("123")  判断对象的值 true   没有实际值判断对象
            System.out.println("是字符串");
        }else{
            System.out.println("不是字符串");
        }
    }
    //String API没有讲全---会查API【电子政务】
}